import process from 'node:process';
import { URL, fileURLToPath } from 'node:url';
import EnhanceLog from 'vite-plugin-enhance-log';
import react from '@vitejs/plugin-react';
import UnoCSS from 'unocss/vite';
import AutoImport from 'unplugin-auto-import/vite';
import { defineConfig, loadEnv } from 'vite';
import svgr from 'vite-plugin-svgr';
// import { codeInspectorPlugin } from 'code-inspector-plugin';

/**
 * antd 组件自动导入解析器。 约定以 "A" 开头的组件名自动从 antd 导入（如 AButton -> Button）。
 *
 * @param {string} componentName - 组件名
 * @returns {{ from: string; name: string } | null} 返回导入信息或 null。
 */
function autoImportAntd(componentName: string) {
  const pattern = /^A[A-Z]/;
  if (pattern.test(componentName) && componentName.indexOf('AMap') === -1) {
    return { from: 'antd', name: componentName.slice(1) };
  }
  return null;
}

/** antd pro 组件自动导入解析器。 */
function autoImportAntdPro(componentName: string) {
  const pattern = /^P[A-Z]/;
  if (pattern.test(componentName)) {
    return { from: '@ant-design/pro-components', name: componentName.slice(1) };
  }
  return null;
}

// https://vite.dev/config/
export default defineConfig((configEnv: { mode: string; command: string }) => {
  const viteEnv = loadEnv(configEnv.mode, process.cwd());
  console.log('viteEnv', viteEnv);
  return {
    base: viteEnv.VITE_BASE_PATH,
    plugins: [
      react(),
      UnoCSS(),
      // EnhanceLog({
      //   splitBy: ';',
      //   preTip: '🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥',
      // }),
      // codeInspectorPlugin({
      //   bundler: 'vite',
      // }),
      svgr({
        svgrOptions: {
          icon: true,
          ref: true,
          titleProp: true,
        },
      }),
      AutoImport({
        // 自动导入的目录（hooks、组件）
        dirs: ['src/hooks/**', 'src/components/**'],
        // 自动生成的类型声明文件路径
        dts: 'src/types/auto-imports.d.ts',
        // 自动导入的包和类型
        imports: [
          'react',
          'react-router-dom',
          'ahooks',
          { from: 'react', imports: ['FC'], type: true },
          {
            from: 'antd',
            imports: ['FormInstance'],
            type: true, // 标记为类型导入
          },
        ],

        // 仅处理 ts/js/tsx/jsx 文件
        include: [/\.[tj]sx?$/],
        resolvers: [
          autoImportAntd, // antd 组件自动导入解析器
          autoImportAntdPro,
        ],
      }),
    ],
    build: {
      outDir: 'iot', //
      rollupOptions: {
        output: {
          assetFileNames: chunkInfo => {
            const name = chunkInfo.names[0];

            if (name?.endsWith('.css')) {
              return 'css/[name]-[hash].css';
            }

            const imgExts = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'];

            if (imgExts.some(ext => name?.endsWith(`.${ext}`))) {
              return 'images/[name]-[hash].[ext]';
            }

            if (name?.endsWith('.js')) {
              return 'js/[name]-[hash].js';
            }

            return 'assets/[name]-[hash].[ext]';
          },
          chunkFileNames: chunkInfo => {
            // 检查文件路径，如果是 pages 目录下的文件，则修改文件名和路径
            const filePath = chunkInfo.facadeModuleId;

            if (filePath) {
              // 提取文件的父文件夹作为文件名
              if (filePath.includes('/src/pages/')) {
                // 提取文件的父文件夹作为文件名
                const pageName = filePath.split('/src/pages/')[1];
                // 替换 [name] 为  name 因为vite不支持
                const newPath = pageName.replace(/\[([^\]]+)\]/g, '$1');

                const path = newPath.slice(0, newPath.lastIndexOf('/'));

                return `js/pages/${path}/[name]-[hash].js`;
              } else if (filePath.includes('/src/components/')) {
                return `js/components/[name]-[hash].js`;
              }
            }

            return 'js/[name]-[hash].js'; // 默认处理方式
          },
          manualChunks: {
            // 核心框架
            react: ['react', 'react-dom', 'react-error-boundary'],

            // 路由
            router: ['react-router-dom'],

            // 状态管理
            redux: ['redux', 'react-redux', '@reduxjs/toolkit'],

            // UI 框架
            antd: ['antd', '@ant-design/icons', '@ant-design/v5-patch-for-react-19'],

            // 动画
            motion: ['motion', 'framer-motion', 'animate.css', 'animejs'],

            // 网络请求
            network: ['alova'],

            // 工具类
            utils: ['lodash-es', 'dayjs', 'js-cookie', 'crypto-js', '@turf/turf'],
          },
        },
      },
    },
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url)),
        '~': fileURLToPath(new URL('./', import.meta.url)),
      },
    },
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@use "@/styles/variables.scss" as *;`,
        },
      },
    },
    server: {
      proxy: {
        // API 代理配置
        '/api': {
          target: viteEnv.VITE_SERVICE_BASE_URL || 'http://106.14.107.87:8080',
          changeOrigin: true,
          rewrite: path => path.replace(/^\/api/, ''),
        },
      },
    },
  };
});
